﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPPanificadora.controller;
using ASPPanificadora.classes;
using ASPPanificadora.Funcoes;

namespace ASPPanificadora.Telas
{
    public partial class VendaFuncionarioView : System.Web.UI.Page
    {
        IVendaController vendaController;
        IProdutoController produtoController;
        Venda venda = new Venda();
        ItemVenda itemVenda = new ItemVenda();
        IAbrirFecharCaixaController abrirFecharCaixaController;
        IFuncionarioController funcionarioController;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session != null)
            {
                if (Session["IdUsuario"] == null || Session["IdUsuario"].Equals(0))
                {
                    Response.Redirect("~/Telas/LoginView.aspx");
                }
                else if (Session["TipoUsuario"] == null || !ControleAcessoTela.ConfirmaAcessoTela("VendaFuncionarioView", Session["TipoUsuario"]))
                        Response.Redirect("~/Default.aspx");

            }
            else
                Response.Redirect("~/Telas/LoginView.aspx");


            abrirFecharCaixaController = new AbrirFecharCaixaController();
            if (!abrirFecharCaixaController.VerificaCaixaAberto())
            {
                Response.Redirect("~/Default.aspx");
            }

            
            if (!IsPostBack)
            {
                vendaController = new VendaController();
                txtUltimaVenda.Text = vendaController.CodigoUltimaVendaFuncionario().ToString();
                if (Session["ListaItemVenda"] != null)
                    Session["ListaItemVenda"] = null;
                else
                    Session.Add("ListaItemVenda", null);

                funcionarioController = new FuncionarioController();
                IList<Funcionario> listaFuncionarios = funcionarioController.RecuperarAtivos();

                drdListaFuncionario.Items.Add(new ListItem("Selecione", "0"));

                foreach (Funcionario funcionario in listaFuncionarios)
                {
                    drdListaFuncionario.Items.Add(new ListItem(funcionario.NomeFuncionario, funcionario.Id.ToString()));
                }
            }
        }
        
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Default.aspx");
        }

        protected void ExibeMensagem(string msg)
        {
            txtResultado.Text = msg;
        }

        protected void btnPesquisa_Click(object sender, EventArgs e)
        {
            if (ValidaCamposPesquisa())
                LimparCampos();
            else
            {
                try
                {
                    int id = Convert.ToInt32(txtPesquisaCodigo.Text);
                    venda = new Venda();
                    vendaController = new VendaController();
                    venda = vendaController.VendaFuncionarioPesquisarPorId(id);
                    if (venda == null)
                        LimparCampos();
                    else
                    {
                        RedefinirCampos();
                    }
                }
                catch (Exception ex)
                {
                    LimparCampos();
                    ExibeMensagem(ex.ToString());
                }
            }
        }

        protected void txtCodigoProduto_TextChanged(object sender, EventArgs e)
        {
            if (txtCodigoProduto != null && !txtCodigoProduto.Text.Equals("") && txtQtde != null && !txtQtde.Text.Equals(""))
            {
                double codigoProduto = Convert.ToDouble(txtCodigoProduto.Text);
                decimal qtdeProduto = Convert.ToDecimal(txtQtde.Text);
                produtoController = new ProdutoController();

                Produto produto = produtoController.PerquisarPorCodigo(codigoProduto);

                if (produto != null)
                {
                    List<ItemVenda> listaItemVenda;
                    if (Session["ListaItemVenda"] != null)
                        listaItemVenda = (List<ItemVenda>)Session["ListaItemVenda"];
                    else
                        listaItemVenda = new List<ItemVenda>();

                    listaItemVenda.Add(new ItemVenda()
                    {
                        IdProduto = produto.Id,
                        Produto = produto,
                        Qtde = qtdeProduto,
                        Valor = produto.ValorUnitario,
                        ValorTotal = Convert.ToDouble(qtdeProduto * Convert.ToDecimal(produto.ValorUnitario)),
                        Sequencia = listaItemVenda.Count + 1
                    });
                    Session["ListaItemVenda"] = listaItemVenda.ToList();
                    dtlItensVenda.DataSource = listaItemVenda;
                    dtlItensVenda.DataBind();
                    txtQtdeItens.Text = listaItemVenda.Count.ToString();
                    double valorTotal = 0;
                    foreach (ItemVenda item in listaItemVenda)
                    {
                        valorTotal += item.ValorTotal;
                    }
                    txtValorTotalVenda.Text = valorTotal.ToString();
                    txtErroProduto.Text = null;
                    txtErroProduto.Enabled = false;
                    txtCodigoProduto.Text = null;
                    txtQtde.Text = "1";
                }
                else
                {
                    txtErroProduto.Text = "*Produto não encontrado";
                    txtErroProduto.Enabled = true;
                }
            }
            else
            {
                txtErroProduto.Text = null;
                txtErroProduto.Enabled = false;
            }
            AtualizaTroco();
        }

        protected void dtlItensVenda_ItemCommand(object source, DataListCommandEventArgs e)
        {
            List<ItemVenda> listaItemVenda;
            if (Session["ListaItemVenda"] != null)
            {
                listaItemVenda = (List<ItemVenda>)Session["ListaItemVenda"];

                if (e.CommandName.Equals("Excluir"))
                {
                    int sequencia = Convert.ToInt32(e.CommandArgument);

                    ItemVenda item = listaItemVenda.Where(a => a.Sequencia == sequencia).FirstOrDefault();
                    if (item != null)
                    {
                        listaItemVenda.Remove(item);
                    }
                }
                txtQtdeItens.Text = listaItemVenda.Count.ToString();
                double valorTotal = 0;
                int sequenciaNova = 1;
                foreach (var item in listaItemVenda)
                {
                    valorTotal += item.ValorTotal;
                    item.Sequencia = sequenciaNova++;                    
                }
                txtValorTotalVenda.Text = valorTotal.ToString();
                Session["ListaItemVenda"] = listaItemVenda.ToList();
                dtlItensVenda.DataSource = listaItemVenda;
                dtlItensVenda.DataBind();
                AtualizaTroco();
            }
            txtResultado.Text = string.Empty;
        }

        protected void btnRegistrar_Click(object sender, EventArgs e)
        {
            Button botao = (Button)sender;
            if (botao.CommandName.Equals("Registrar"))
            {
                if (Session["ListaItemVenda"] != null)
                {
                    List<ItemVenda> listaItemVenda = (List<ItemVenda>)Session["ListaItemVenda"];
                    if (listaItemVenda.Count > 0 && ValidaCampos())
                    {
                        string msg = "";
                        try
                        {
                            listaItemVenda = (List<ItemVenda>)Session["ListaItemVenda"];
                            venda = new Venda();
                            venda.Id = Convert.ToInt32(txtCodigo.Text);
                            venda.QtdeItens = listaItemVenda.Count;
                            venda.IdUsuario = Convert.ToInt32(Session["IdUsuario"]);
                            venda.ValorEmDinheiro = Convert.ToDouble(txtValorDinheiro.Text);
                            venda.ValorTotalVenda = Convert.ToDouble(txtValorTotalVenda.Text);
                            venda.ValorTroco = Convert.ToDouble(txtValorTroco.Text);
                            venda.DataVenda = DateTime.Now;
                            venda.FechamentoVenda = false;
                            venda.IdFuncionario = Int32.Parse(drdListaFuncionario.SelectedValue);


                            vendaController = new VendaController();

                            msg = vendaController.Salvar(venda, listaItemVenda);
                            txtUltimaVenda.Text = venda.Id.ToString();
                            LimparCampos();
                        }
                        catch (Exception ex)
                        {
                            msg = "Erro: " + ex.Message.ToString();
                        }
                        finally
                        {
                            txtPesquisaCodigo.Text = null;
                            ExibeMensagem(msg);
                        }
                    }
                }
            }
            else if (botao.CommandName.Equals("Excluir"))
            {
                if (txtCodigo != null || !txtCodigo.Text.Equals("") || !txtCodigo.Text.Equals("0"))
                {
                    string msg = "";
                    try
                    {
                        vendaController = new VendaController();
                        msg = vendaController.Exclui(Convert.ToInt32(txtCodigo.Text));
                        txtUltimaVenda.Text = vendaController.CodigoUltimaVendaFuncionario().ToString();
                        LimparCampos();
                    }
                    catch (Exception ex)
                    {
                        msg = "Erro: " + ex.Message.ToString();
                    }
                    finally
                    {
                        ExibeMensagem(msg);
                    }
                }
            }
        }

        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            LimparCampos();
        }

        protected void txtValorDinheiro_TextChanged(object sender, EventArgs e)
        {
            AtualizaTroco();
        }

        private void AtualizaTroco()
        {
            if (txtValorDinheiro != null && !txtValorDinheiro.Text.Equals("") && txtValorTotalVenda.Text != null && !txtValorTotalVenda.Text.Equals(""))
            {
                double totalCompra = Convert.ToDouble(txtValorTotalVenda.Text);
                double valorDinheiro = Convert.ToDouble(txtValorDinheiro.Text);
                if (totalCompra > valorDinheiro)
                    txtValorTroco.Text = "*Insuficiente";
                else
                    txtValorTroco.Text = Convert.ToString(valorDinheiro - totalCompra);
            }
            txtResultado.Text = string.Empty;
        }

        private void LimparCampos()
        {
            txtErroProduto.Text = null;
            txtCodigo.Text = "0";
            txtCodigoProduto.Text = null;
            txtPesquisaCodigo.Text = null;
            txtQtde.Text = "1";
            txtQtdeItens.Text = "0";
            txtResultado.Text = null;
            txtValorDinheiro.Text = null;
            txtValorTotalVenda.Text = null;
            txtValorTroco.Text = null;
            if (Session["ListaItemVenda"] != null)
                Session["ListaItemVenda"] = null;
            else
                Session.Add("ListaItemVenda", null);

            dtlItensVenda.DataSource = null;
            dtlItensVenda.DataBind();
            txtQtde.Enabled = true;
            txtValorDinheiro.Enabled = true;
            txtCodigoProduto.Enabled = true;
            btnRegistrar.Text = "Registrar";
            btnRegistrar.CommandName = "Registrar";
            drdListaFuncionario.SelectedValue = "0";
            drdListaFuncionario.Enabled = true;
        }

        private bool ValidaCamposPesquisa()
        {
            if (txtPesquisaCodigo == null || txtPesquisaCodigo.Text.Equals("") || txtPesquisaCodigo.Text.Equals("0"))
                return true;
            else
                return false;
        }
        private void RedefinirCampos()
        {
            if (venda != null && venda.Id != 0)
            {
                txtPesquisaCodigo.Text = null;
                txtResultado.Text = null;
                txtCodigo.Text = venda.Id.ToString();
                txtCodigoProduto.Text = null;
                txtQtde.Text = null;

                dtlItensVenda.DataSource = venda.ItemVenda;
                dtlItensVenda.DataBind();

                txtErroProduto.Text = null;
                txtQtdeItens.Text = venda.ItemVenda.Count.ToString();
                txtValorTotalVenda.Text = venda.ValorTotalVenda.ToString();
                txtValorDinheiro.Text = venda.ValorEmDinheiro.ToString();
                txtValorTroco.Text = venda.ValorTroco.ToString();
                txtQtde.Enabled = false;
                txtValorDinheiro.Enabled = false;
                txtCodigoProduto.Enabled = false;
                btnRegistrar.Text = "Excluir";
                btnRegistrar.CommandName = "Excluir";
                drdListaFuncionario.SelectedValue = venda.IdFuncionario.ToString();
                drdListaFuncionario.Enabled = false;
            }
        }

        private bool ValidaCampos()
        {
            if(txtValorTotalVenda.Text == null && txtValorTotalVenda.Text.Equals(""))
                return false;
            else if(txtValorTotalVenda.Text == null && txtValorTotalVenda.Text.Equals(""))
                return false;
            else
                return true;
        }
    }
}